Zapis tisicu polozek do DB
Otázka od: David Klodner
4. 4. 2004 13:54
Zdravim,
chtel bych se zeptat, jak resite pripady, kdy potrebujete do DB zapsat
tisice radku.
Ja napr. importuju do sveho programu cenik zbozi o 13 000 polozkach.
Kazda polozka ma 25 atributu (ean, nazev, cena1, cena2 ...)
Cenik mam budto v textove podobe nebo jako DBF a potrebuju ho dostat do
IB6 tabulky.
Zapisuju to pres IBTable, ale je to dost pomale a hlavne se to v prubehu
hrozne zpomaluje. Prvnich 1000 polozek se ulozi
behem par vterin, ale posledni tisicovka zabere uz nekolik minut.
David Klodner
D5 Prof, IB6, WinXP
Odpovedá: Martin Schayna
4. 4. 2004 14:14
David Klodner <d.klodner@ordis.cz> wrote:
> chtel bych se zeptat, jak resite pripady, kdy potrebujete do DB zapsat
> tisice radku.
>
> Zapisuju to pres IBTable, ale je to dost pomale a hlavne se to v
> prubehu hrozne zpomaluje. Prvnich 1000 polozek se ulozi
> behem par vterin, ale posledni tisicovka zabere uz nekolik minut.
Nepises jak resis transakce, ale nejrychlejsi metoda pro takoveto
vkladani dat je zapisovat v ramci jedne transakce 500-1000 vet
a pokazde tento blok commitovat.
Martin Schayna
Odpovedá: David Klodner
4. 4. 2004 14:58
>> chtel bych se zeptat, jak resite pripady, kdy potrebujete do DB
zapsat
>> tisice radku.
>>
>> Zapisuju to pres IBTable, ale je to dost pomale a hlavne se to v
>> prubehu hrozne zpomaluje. Prvnich 1000 polozek se ulozi behem par
>> vterin, ale posledni tisicovka zabere uz nekolik minut.
>Nepises jak resis transakce, ale nejrychlejsi metoda pro takoveto
vkladani dat je zapisovat v ramci jedne transakce 500-1000 vet
>a pokazde tento blok commitovat.
>Martin Schayna
Jak se to v TIBTransaction nastavi?
Params mam:
read_committed
rec_version
nowait
A kdyz budu commitovat naraz 1000 vet a v jedne bude chyba, tak co se
stane? Neulozi se ani jedna?
Nebo vsechny krome te chybne?
David Klodner
D5 Prof, IB6, WinXP
Odpovedá: Martin Schayna
4. 4. 2004 15:20
David Klodner <d.klodner@ordis.cz> wrote:
>> Nepises jak resis transakce, ale nejrychlejsi metoda pro takoveto
>> vkladani dat je zapisovat v ramci jedne transakce 500-1000 vet
>> a pokazde tento blok commitovat.
>
> Jak se to v TIBTransaction nastavi?
> Params mam:
> read_committed
> rec_version
> nowait
Params jsou spravne, ale musis explicitne volat StartTransaction/Commit
IBTransaction.StartTransaction;
try
// zapis vet
IBTransaction.Commit;
except
IBTransaction.Rollback; // to kdyby doslo k jine chybe
end;
> A kdyz budu commitovat naraz 1000 vet a v jedne bude chyba, tak co se
> stane? Neulozi se ani jedna?
Ano, pokud selze Commit, neulozi se nic od StartTransaction.
Pokud v prubehu zapisu chces odvolat vsechny zmeny sam,
musis zavolat Rollback.
Martin Schayna
Odpovedá: Fedor fi0dor Tirsel
4. 4. 2004 15:37
David Klodner wrote:
> Jak se to v TIBTransaction nastavi?
> Params mam:
> read_committed
> rec_version
> nowait
Nenastavi sa to nijak... proste pri vkladani urcite iterujete (for, while,
repeat), tak si tam treba osetrit nieco na sposob:
if (i=1000) then
begin
transaction.commit;
i := 0;
end;
kde "i" je lokalna premenna oznacujuca pocet uz vlozenych riadkov do DB.
> A kdyz budu commitovat naraz 1000 vet a v jedne bude chyba, tak co se
> stane? Neulozi se ani jedna?
> Nebo vsechny krome te chybne?
Neulozi sa ani jedna -- princip transakcii: "bud vsetko, alebo nic".
> David Klodner
> D5 Prof, IB6, WinXP
Este snad jeden tip: skuste pouzivat IBScript resp. pripravit si
"insert
query" s parametrami (query.pramByName()), dat query.Prepare a potom
si uz iba
pri iteracii menit parametre dotazu. Taktiez by sa mohlo hodit "vypnut" indexy
tabulky, kam vkladate udaje, a po vlozeni ich opat zaktivovat (pozrite sa na
syntax ALTER INDEX).
S pozdravom...
--
Fedor 'fi0dor' Tirsel
www.fi0dor.info
Odpovedá: Karel Kral
5. 4. 2004 14:37
My to resime pres stored proceduru, kterou volame pro pridani kazdeho
radku. Jako pamametry predavame hodnoty jednotlivych poli. U MS SQL je
to nejrychlejsi.
Cely postup je tento:
pridat vsechny zaznamy do pracovni tabulky - bez indexu
pracovni tabulku prejmenovat na ostrou a preindexovat
David Klodner wrote:
>
> Zdravim,
>
> chtel bych se zeptat, jak resite pripady, kdy potrebujete do DB zapsat
> tisice radku.
> Ja napr. importuju do sveho programu cenik zbozi o 13 000 polozkach.
> Kazda polozka ma 25 atributu (ean, nazev, cena1, cena2 ...)
> Cenik mam budto v textove podobe nebo jako DBF a potrebuju ho dostat do
> IB6 tabulky.
>
> Zapisuju to pres IBTable, ale je to dost pomale a hlavne se to v prubehu
> hrozne zpomaluje. Prvnich 1000 polozek se ulozi
> behem par vterin, ale posledni tisicovka zabere uz nekolik minut.
>
> David Klodner
> D5 Prof, IB6, WinXP
--
______________________________________________________
Karel Kral, vedouci odd. IT / IT manager
Purus, s.r.o., Cezavy 627, 664 56 Blucina, CZ
Tel: 547 235 000, 602 552 432, Fax: 547 231 203
E-Mail: mailto:kral@purus.cz, WWW: http://www.purus.cz
______________________________________________________